//============================================================================
// Name        : main.cpp
// Author      : Carlos Alegría
// Description : Programa para mostrar la utilización básica de objetos de una
//               clase propia.
//============================================================================

#include <iostream>
#include "Vector.h"

using namespace std;
using namespace poo;

int
main()
{

  // creación de objetos a través de referencias "directas" a Vector3D
  //
  Vector3D vector1(2, 3, 4);
  Vector3D vector2(1, 1, 1);
  Vector3D vector3(vector2);

  // utilización de operadores
  //
  Vector3D suma = vector1 + vector2;

  cout << "x = " << suma.getX() << ", y = " << suma.getY() << ", z = "
      << suma.getZ() << endl;
  cout << vector1 << endl;
  cout << vector1 - vector2 << endl;

  // al utilizar un operador, el compilador convierte el código en una llamada
  // a la función que implementa el comportamiento del operador utilizado
  //
  operator <<(cout, vector1) << endl;

  // creando un objeto a través de un apuntador a Vector3D
  //
  Vector3D *vector4 = new Vector3D(5, 6, 7);

  // Esta instrucción no utiliza el operador implementado en la clase Vector3D,
  // ya que la firma no recibe un apuntador a Vector3D. En su lugar, imprimirá
  // el contenido del apuntador, i.e., la dirección del primer bloque de memoria
  // reservada para el objeto de Vector3D con coordenadas 5, 6, 7.
  //
  // Para implementar este comportamiento sería necesario sobrecargar el
  // operador con una función del tipo
  //
  // ostream &
  // operator<<(ostream &, const Vector3D *)
  //
  cout << "apuntador = " << vector4 << endl;

  // con el operador "*" podemos utilizar el operador << definido en Vector3D
  //
  cout << "objeto = " << *vector4 << endl;

  return 0;
}
